#pragma once

#include "HttpRequest.h"
#include "HttpResponse.h"
#include "Buffer.h"

typedef enum
{
    RECV_HTTP_ERROR, //出错
    RECV_HTTP_LINE,  // 请求行
    RECV_HTTP_HEAD,  // 请求头
    RECV_HTTP_BODY,  // 请求正文
    RECV_HTTP_OVER   // 结束阶段
} HttpRecvStatu;

#define MAX_LIN 81920

class HttpContext
{
public:
    int _resp_statu;           // 状态响应码
    HttpRecvStatu _recv_statu; // 当前接收解析的阶段状态
    HttpRequest _request;      // 当前已经解析到的请求信息

private:
    // 解析HTTP请求行，使用正则来匹配传入的line参数
    // 已提取HTTP请求的方法资源路径、查询字符串和协议版本等下信息
    // GET /api/data?id=123 HTTP/1.1\r\n
    bool ParseHttpLine(const std::string &line);

    // 2. 读取请求行
    bool RecvHttpLine(Buffer *buf);

    // 3. 解析请求头部
    bool ParseHttpHead(std::string &line);

    // 4. 读取请求头部
    bool RecvHttpHead(Buffer *buf);

    // 5. 读取请求正文
    bool RecvHttpBody(Buffer *buf);

public:
    HttpContext();
    void ReSet();

    // 获取相对应状态码
    int RespStatu();

    // 获取接收状态
    HttpRecvStatu RecvStatu();

    // 获取已经得到的请求信息
    HttpRequest &Request();

    // 接收并解析HttpRequest请求
    void RecvHttpRequest(Buffer *buf);
};